#!/usr/bin/env node
/**
* @Author: fiyc
* @Date : 2019-04-19 14:48
* @FileName : index.js
* @Description :
*     - 入口文件
      - 定义命令行参数
*/

const projectInfo = require('../package.json');
const project = require('commander');
const handler = require('./command-handler');

// 程序版本定义
project.version(projectInfo.version);
project.usage("<command> [options]");

project.command('receive')
    .description('接受MQTT消息')
    .usage('[option]')
    .option('-H, --host [value]', 'MQTT服务器地址, 默认127.0.0.1')
    .option('-P, --port [value]', 'MQTT端口号, 默认1883')
    .option('-u, --username [value]', 'MQTT用户名')
    .option('-p, --password [value]', 'MQTT密码')
    .option('-f, --file [value]', '使用配置文件代替命令行参数')
    .option('-i, --id [value]', '指定一个客户端id, 默认随机生成')
    .option('-t, --topic [value]', '订阅主题, 默认所有主题')
    .option('-c, --no-clean', '断开连接后服务器不清除会话, 默认true')
    .action(argv => {
        let { host, port, username, password, file, clean, id, topic } = argv;
        handler.receive({
            host,
            port,
            username,
            password,
            file,
            clean,
            id,
            topic
        });
    });

project.command('send')
    .description('发送MQTT消息')
    .usage('[option]')
    .option('-H, --host [value]', 'MQTT服务器地址, 默认127.0.0.1')
    .option('-P, --port [value]', 'MQTT端口号, 默认1883')
    .option('-u, --username [value]', 'MQTT用户名')
    .option('-p, --password [value]', 'MQTT密码')
    .option('-f, --file [value]', '使用配置文件代替命令行参数')
    .option('-i, --id [value]', '指定一个客户端id, 默认随机生成')
    .option('-t, --topic [value]', '订阅主题, 默认所有主题')
    .option('-m, --message [value]', '推送的消息')
    .action(argv => {
        let { host, port, username, password, file, message, id, topic } = argv;
        handler.send({
            host,
            port,
            username,
            password,
            file,
            message,
            id,
            topic
        });
    });

project.command('cfg')
    .description('在当前位置创建一个配置文件')
    .usage('[option]')
    .option('-R, --is-receive', '接收消息配置文件')
    .option('-S, --is-send', '发送消息配置文件')
    .action(argv => {
        if(!argv.isReceive && !argv.isSend){
            console.error('缺少必要参数, 至少选择一项配置文件');
            return;
        }

        if(argv.isReceive){
            handler.copyConfig('receive');
        }

        if(argv.isSend){
            handler.copyConfig('send');
        }

    });

project.parse(process.argv);
